package com.xjh.basestudy.designmode.behaviorMode.behaviorMode2_Iterator;

/**
 * @author XuJianHua
 * @date 2022-09-29 17:13:16
 * @description
 * *行车记录仪类在第16行实现了Iterable接口的iterator()方法，并实例化一个迭代器并返回客户端。
 * * 接着我们在第20行以内部类的形式实现了行车记录仪的迭代器，这样就能使迭代器轻松访问行车记录仪的私有数据集，
 * * 并同时达到了迭代器与集合分离的目的。迭代器实现的重点在于第21行定义的迭代器游标cursor，我们将其初始化为集合索引的位置，二者相对独立，自此再无瓜葛。
 * * 接着是对迭代器接口标配的2个方法hasNext()与next()的实现，相较于重构之前，代码看起来简单多了，相信读者可以轻松理解
com.xjh.basestudy.designmode.behaviorMode.behaviorMode2_Iterator.Iterator
 */
public class DrivingRecorder implements Iterable<String>{

    private int index = -1;// 当前记录位置
    private String[] records = new String[10];// 假设只能记录10条视频

    public void append(String record) {
        if (index == 9) {//索引重置，从头覆盖
            index = 0;
        } else {
            index++;
        }
        records[index] = record;
    }



    @Override
    public java.util.Iterator<String> iterator() {
        return (java.util.Iterator<String>) new Itr();
    }

    private class Itr implements Iterator<String> {
        int cursor = index;// 迭代器游标，不波及原始集合索引
        int loopCount = 0;

        @Override
        public boolean hasNext() {
            return loopCount < 10;
        }

        @Override
        public String next() {
            int i = cursor;// 记录即将返回的游标位置
            if (cursor == 0) {
                cursor = 9;
            } else {
                cursor--;
            }
            loopCount++;
            return records[i];
        }
    };

}